package com.kingmed.kmss.common.redis.service.impl;

import com.kingmed.kmss.common.redis.RedisKeyDefinition;
import com.kingmed.kmss.common.utils.DateTimeUtil;
import com.kingmed.kmss.common.utils.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kingmed.kmss.common.redis.dao.IRedisIdGeneratorDao;
import com.kingmed.kmss.common.redis.service.IRedisIdGeneratorService;

import java.time.LocalDate;
import java.util.concurrent.TimeUnit;

/**
 * Redis 业务Id生成器
 */
@Slf4j
@Service
public class RedisIdGeneratorServiceImpl implements IRedisIdGeneratorService {

    @Autowired
    IRedisIdGeneratorDao redisDao;

    public String generateTransactionNo(String orgNo, String transactionType) {

        String keyPrefix = RedisKeyDefinition.BizId_Key_Prefix_Transaction + ":"; // 交易号的键值前缀
        LocalDate today = DateTimeUtil.getCurrentDateJ8(); // 当前的日期
        String stringDate = DateTimeUtil.getDateStringWtihShortFormat(today); // 将日期格式转成 "yyyyMMMdd"

        StringBuffer sb = new StringBuffer();
        sb.append(orgNo); // 交易号的第1段: 机构号
        sb.append(transactionType); // 交易号的第2段: 交易类型
        sb.append(stringDate); // 交易号的第3段: 当前日期

        long counter = this.redisDao.generateId(keyPrefix + sb.toString(), 1, TimeUnit.DAYS); // 生成序号, 失效期设成 1 天

        sb.append(String.format("%06d", counter)); // 交易号的第4段: 序号。 将序号变成6位长度，如果不足，在前面用0补齐

        String id = StringUtil.removeCharFromString(sb.toString(), ':'); // 去掉键值中的冒号

        log.info(" 生成的交易号是：`{}", id);

        return id;
    }

    public String generateProcessBizKey(String bizType) {

        String keyPrefix = RedisKeyDefinition.Process_Key_Prefix_BizKey + ":"; // 交易号的键值前缀
        LocalDate today = DateTimeUtil.getCurrentDateJ8(); // 当前的日期
        String stringDate = DateTimeUtil.getDateStringWtihShortFormat(today); // 将日期格式转成 "yyyyMMMdd"

        StringBuffer sb = new StringBuffer();
        sb.append(bizType); // 业务key的第1段: 业务类型
        sb.append("-" + stringDate); // 交易号的第2段: 当前日期

        // 生成序号,失效期设成1天
        long counter = this.redisDao.generateIdWithinDistributedEnv(keyPrefix + sb.toString(), 1, TimeUnit.DAYS);

        sb.append(String.format("%03d", counter)); // 交易号的第3段: 序号。 将序号变成5位长度，如果不足，在前面用0补齐

        String id = StringUtil.removeCharFromString(sb.toString(), ':'); // 去掉键值中的冒号

        log.info(" 生成的流程业务编号是：{}", id);

        return id;
    }
}
